﻿#ifndef DPCL_H
#define DPCL_H

#include <QtWidgets/QWidget>
//Qt 会根据.ui 文件（如 mainMenu.ui）自动生成对应的头文件（ui_mainMenu.h）
#include "ui_mainMenu.h"

#include "SparseReconstructor.h"

#include "vtkAutoInit.h"
VTK_MODULE_INIT(vtkRenderingOpenGL2)
VTK_MODULE_INIT(vtkInteractionStyle)
VTK_MODULE_INIT(vtkRenderingFreeType)
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2)


#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>


#include <vtkRenderWindow.h> 
#include <vtkGenericOpenGLRenderWindow.h>		
#include <QVTKOpenGLNativeWidget.h>	
#include <vtkGenericRenderWindowInteractor.h> 
#include <vtkSmartPointer.h>
#include <vtkRenderer.h>

#include <vtkConeSource.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkVersion.h>

#include <qdebug.h>
#include <qfiledialog.h>
#include <qmessagebox.h>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWidget; }
QT_END_NAMESPACE

class MainWidget : public QWidget {

	Q_OBJECT

public:

	MainWidget(QWidget *p = nullptr);
	~MainWidget();


private:
	//Form 是ui文件里面窗体的类名
	Ui::Form *uiMain;

	SparseRecontructor reconstructor_;
	std::vector<std::string> image_paths_;

	// VTK 核心组件（成员变量，便于在其他函数中访问）
	vtkSmartPointer<vtkRenderer> main_render_3d;          // 渲染器
	vtkSmartPointer<vtkGenericOpenGLRenderWindow> renWin3D;  // 渲染窗口
	vtkSmartPointer<vtkRenderWindowInteractor> interactor;   // 交互器

private:

	// 初始化点云可视化窗口
	void initViewer();
	
	// 显示点云
	void showPointCloud(pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud);

	std::vector<std::string> imagePaths;

	vtkNew<vtkRenderer> renderer;
	vtkNew<vtkGenericOpenGLRenderWindow> renderWindow;

	SparseRecontructor* m_reconThread;  // 重建线程
	pcl::PointCloud<pcl::PointXYZRGB>::Ptr m_pointCloud;
	

private slots:

	void on_selectImagesBtn_clicked();  // 选择图片按钮
	void on_reconstructBtn_clicked();   // 重建按钮

	 // 线程信号对应的槽函数（主线程执行）
	void on_progressUpdate(int progress, const QString& status);
	void on_reconstructFinished(pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud);
	void on_errorOccurred(const QString& errorMsg);

};


#endif // !DPCL_H
